#include <iostream>
#include <cmath>
#include "Linea.h"

using namespace std;

Linea::
Linea(const Punto& p, const Punto& p1)
{
    if(p.GetX() < p1.GetX())
    {
        SetX(p.GetX());
        SetY(p.GetY());
        q = p1;
    }
    else if(p.GetX() > p1.GetX())
    {
        SetX(p1.GetX());
        SetY(p1.GetY());
        q = p;
    }
    else
    {
        if(p.GetY() < p1.GetX())
        {
            SetX(p.GetX());
            SetY(p.GetY());
            q = p1;
        }
        else
        {
            SetX(p1.GetX());
            SetY(p1.GetY());
            q = p;
        }
    }
}

void
Linea::
Dibujar()
{
    cout << "Dibujo una linea con los siguientes puntos:\n";
    cout << "\t";
    Primitiva::Dibujar();
    cout << "\n\t";
    q.Dibujar();
}

Linea::
Linea(const Linea& l) : Primitiva(l.GetX(), l.GetY()), q(l.GetQ())
{

}

Linea&
Linea::operator=(const Linea& l)
{
    if(this != &l)
    {
        this -> ~Linea();
        Primitiva::SetX(l.GetX());
        Primitiva::SetY(l.GetY());
        
        q = (l.GetQ());

    }

    return *this;
}

void
Linea::Move(int x, int y)
{
    q.Primitiva::Move(x, y);
    Primitiva::Move(x, y);
}

void
Linea::Redimensionar(bool aumentar, bool x, bool y)
{
    
    int n = 1;
    int dX = abs((float) GetX() - q.GetX());
    int dY = abs((float) GetY() - q.GetY());

    /* Ajusta el valor a aplicar */
    if(!aumentar)
        n = -1;

    /* Modifica la x */
    if(x)
    {
        /* Controla que los dos puntos no se junten en X (a no ser que difieran en Y) */
        if(!aumentar)
        {
            /* No sobrepasa la coordenada X del punto de referencia */
            if(dX > 1)
                q.SetX(q.GetX()+n);
            else if(dX == 1 && dY > 1)
                q.SetX(q.GetX()+n);
        }
        else if(aumentar)
            q.SetX(q.GetX()+n);
    }
        
    if(y)
    {
        /* Controla que los dos puntos no se junten en Y (a no ser que difieran en X) */
        if(!aumentar)
        {
            /* No sobrepasa la coordenada Y del punto de referencia */
            if(dY > 1)
                q.SetY(q.GetY()+n);
            else if(dY == 1 && dX > 1)
                q.SetY(q.GetY()+n);
        }
        else if(aumentar)
            q.SetY(q.GetY()+n);
    }
}

void Linea::Rotar(int inc) {
    //Primer punto
    double distOrigenYPunto = sqrt(GetX()*GetX() + GetY()*GetY());
    double angOrigenYPunto = atan2(GetY(), GetX()) * 180 / PI;

    SetX(cos((angOrigenYPunto+inc)*PI/180)*distOrigenYPunto);
    SetY(sin((angOrigenYPunto+inc)*PI/180)*distOrigenYPunto);

    //Segundo punto
    distOrigenYPunto = sqrt(GetQ().GetX()*GetQ().GetX() + GetQ().GetY()*GetQ().GetY());
    angOrigenYPunto = atan2(GetQ().GetY(), GetQ().GetX()) * 180 / PI;

    Punto p2(cos((angOrigenYPunto+inc)*PI/180)*distOrigenYPunto, sin((angOrigenYPunto+inc)*PI/180)*distOrigenYPunto);
    SetQ(p2);
}